package com.boxman;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler.Callback;
import android.os.Message;
import android.util.Size;
import android.view.View;
import android.widget.TextView;

import com.common.GameBoard;
import com.common.InputBox;

// 主活动
public class MainActivity extends Activity implements Callback, GameBoard.Callback, InputBox.Callback {
    private Game mGame;                 // 游戏
    private TextView mLabelInformation; // 信息标签

    /**
     * 自定义事件的响应方法。
     * @param message   事件
     * @return 事件在此被处理则返回 true，否则返回 false
     */
    @Override
    public boolean handleMessage(Message message) {
        switch (message.what) {
            case Const.UM_GAME_OVER:
                this.onGameOver((Boolean)message.obj);
                return true;
            case Const.UM_GOTO_LEVEL:
                this.onGotoLevel(message.arg1);
                return true;
            case Const.UM_MAM_MOVED:
                this.onManMoved(message.arg1);
                return true;
        }

        return false;
    }

    /**
     * 方向按钮的单击响应方法。
     * @param view  按钮
     */
    public void onButtonDirectionClicked(View view) {
        mGame.onFling(view.getId());
    }

    /**
     * "重玩本关"按钮的单击响应方法。
     * @param view  按钮
     */
    public void onButtonRestartClicked(View view) {
        mGame.restart();
    }

    /**
     * "选关"按钮的单击响应方法。
     * @param view  按钮
     */
    public void onButtonSelectLevelClicked(View view) {
        // 显示输入窗口
        final String tipText = super.getString(R.string.IDS_PLEASE_INPUT_NUMBER, Const.LEVEL_COUNT);
        new InputBox(this, this, mGame.getLevel(), Const.LEVEL_COUNT, 1, tipText).show();
    }

    /**
     * "回退"按钮的单击响应方法。
     * @param view  按钮
     */
    public void onButtonUndoClicked(View view) {
        mGame.undo();
    }

    /**
     * 创建事件的响应方法。
     * @param savedInstanceState    保存的实例状态
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_main);

        final GameBoard gameBoard = super.findViewById(R.id.IDC_GAME_BOARD);
        gameBoard.setCallback(this);
    }

    /**
     * 游戏区域度量尺寸事件的响应方法。
     * @param gameBoard         游戏区域
     * @param widthMeasureSpec  父控件指定的宽度值
     * @param heightMeasureSpec 父控件指定的高度值
     * @return 游戏区域的尺寸
     */
    @Override
    public Size onGameBoardMeasure(View gameBoard, int widthMeasureSpec, int heightMeasureSpec) {
        // 获取可用的最大屏幕尺寸
        final int screenMaxWidth = View.MeasureSpec.getSize(widthMeasureSpec);

        // 计算格的尺寸
        BaseGameObject.sSize = screenMaxWidth / Const.GAME_BOARD_GRID_COUNT_H;

        // 计算游戏区域的尺寸
        final int width = BaseGameObject.sSize * Const.GAME_BOARD_GRID_COUNT_H;
        final int height = BaseGameObject.sSize * Const.GAME_BOARD_GRID_COUNT_V;

        return new Size(width, height);
    }

    /**
     * 游戏结束事件的响应方法。
     * @param allOver   全部通关则为 true，否则为 false
     */
    private void onGameOver(boolean allOver) {
        if (allOver) {
            new AlertDialog.Builder(this)
                .setCancelable(false)
                .setMessage(R.string.IDS_WON_ALL_OVER)
                .setPositiveButton(android.R.string.ok, null)
                .show();
        } else {
            new AlertDialog.Builder(this)
                .setCancelable(false)
                .setMessage(R.string.IDS_WON)
                .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> mGame.gotoNextLevel())
                .show();
        }
    }

    /**
     * 进入关卡事件的响应方法。
     * @param level 关卡数
     */
    private void onGotoLevel(int level) {
        final String text = super.getString(R.string.IDS_INFORMATION, level, 0);
        mLabelInformation.setText(text);
    }

    /**
     * 输入窗口的"确定"按钮的单击响应方法。
     * @param intValue  用户输入的数值
     */
    @Override
    public void onInputBoxOK(int intValue) {
        mGame.gotoLevel(intValue);
    }

    @Override
    public void onInputBoxOK(String stringValue) {
    }

    @Override
    public void onInputBoxCancel() {
    }

    /**
     * 小人移动事件的响应方法。
     * @param moveCount 移动次数
     */
    private void onManMoved(int moveCount) {
        final String text = super.getString(R.string.IDS_INFORMATION, mGame.getLevel(), moveCount);
        mLabelInformation.setText(text);
    }

    /**
     * 焦点变化事件的响应方法。
     * @param hasFocus 获得了焦点则为 true，否则为 false
     */
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (mGame == null) {
            // 设置标签的文字
            final String text = super.getString(R.string.IDS_INFORMATION, 1, 0);
            mLabelInformation = super.findViewById(R.id.IDC_LABEL_INFORMATION);
            mLabelInformation.setText(text);

            // 创建游戏区域
            final GameBoard gameBoard = super.findViewById(R.id.IDC_GAME_BOARD);

            // 创建游戏
            mGame = new Game(this, gameBoard.getDrawer(), gameBoard);
        }
    }
}
